//
// Created by QU on 24-6-24.
//
#include <iostream>
#include <functional>
#include <utility>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <new>
#include <thread>
#include <algorithm>
#include <array>
#include <string>
#include <deque>

using std::cout, std::cin, std::endl;

// 所谓结构化绑定是指将一个或者多个名称绑定到初始化对象中的一个或者多个子对象（或者元素）上，
// 相当于给初始化对象的子对象（或者元素）起了别名，请注意别名不同于引用，这一点会在后面详细介绍。
struct BindTest
{
    int a = 42;
    std::string b = "hello structured binding";
};

int main(int argc, const char* argv[])
{
    BindTest bt;
    // const auto [x, y] = bt;
    // 真实的情况是，在结构化绑定中编译器会根据限定符生成一个等号右边对象的匿名副本，而绑定的对象正是这个副本而非原对象本身。
    /*
    编译器为其生成的代码大概是这样的：
    BindTest bt;
    const auto _anonymous = bt;
    aliasname x = _anonymous.a
    aliasname y = _anonymous.b
    */

    const auto& [x, y] = bt;

    std::cout << "x=" << x << " y=" << y << std::endl << std::endl;

    std::cout << "&bt.a=" << &bt.a << " &x=" << &x << std::endl;
    std::cout << "&bt.b=" << &bt.b << " &y=" << &y << std::endl;
    std::cout << "std::is_same_v<const int, decltype(x)>="
        << std::is_same_v<const int, decltype(x)> << std::endl; // 并不是int, 而是const int
    std::cout << "std::is_same_v<const std::string, decltype(y)>="
        << std::is_same_v<const std::string, decltype(y)> << // 并不是std::string, 而是const std::string
        std::endl;



}
